package br.com.jk.consultaxml;

import br.com.jk.config.Cfg;
import br.com.jk.config.CfgPropUtil;
import imp.ObjectFactory;
import imp.TEnviNFe;
import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;

/**
 *
 * @author camilo
 */
public class ProcessaXmlUtil {

  public static void main() {
    BuscaXml xml = new BuscaXml();
//    Carrega o parâmetro definido no arquivo .properties
    CfgPropUtil cfgProp = new CfgPropUtil();
    Cfg cfg = cfgProp.getCfgProp();
    String caminhoXml = cfg.getXmlDiretorio();
    String chaveAcesso = JOptionPane.showInputDialog(null, "Digite a chave de acesso da NF-e",
            "Chave de acesso", JOptionPane.PLAIN_MESSAGE);

    if (chaveAcesso == null || chaveAcesso.isEmpty()) {
      return;
    }
    xml.setArquivoName(chaveAcesso);
    File arquivo = new File(caminhoXml + xml.getArquivoName() + ".xml");

    if (arquivo.exists()) {
      xml.setArquivo(arquivo);
      BuscaXml xmlproc = carregaXml(arquivo);
      BuscaXmlJDialog.getInstance(null, true, xmlproc).setVisible(true);
    } else {
      JOptionPane.showMessageDialog(null, "Arquivo \"" + arquivo.getName() + "\" não encontrado!", "", JOptionPane.WARNING_MESSAGE);
    }
  }

  private static BuscaXml carregaXml(File xml) {
    BuscaXml buscaXml = new BuscaXml();
    TEnviNFe enviNfe = ObjectFactory.createTEnviNFe();
    try {
      JAXBContext context = JAXBContext.newInstance("imp");
      Unmarshaller unmarshaller = context.createUnmarshaller();
      enviNfe = unmarshaller.unmarshal(new StreamSource(xml), TEnviNFe.class).getValue();

      buscaXml.setArquivo(xml);
      buscaXml.setDestinatarioCnpj(enviNfe.getNFe().get(0).getInfNFe().getDest().getCNPJ());
      buscaXml.setDestinatarioRazao(enviNfe.getNFe().get(0).getInfNFe().getDest().getXNome());
      buscaXml.setFornecedorCnpj(enviNfe.getNFe().get(0).getInfNFe().getEmit().getCNPJ());
      buscaXml.setFornecedorRazao(enviNfe.getNFe().get(0).getInfNFe().getEmit().getXNome());
      buscaXml.setNumNfe(Integer.parseInt(enviNfe.getNFe().get(0).getInfNFe().getIde().getNNF()));
      buscaXml.setTotalNfe(new BigDecimal(enviNfe.getNFe().get(0).getInfNFe().getTotal().getICMSTot().getVNF()));

      List<BuscaXmlProduto> produtos = new ArrayList<>();
      for (int i = 0; i < enviNfe.getNFe().get(0).getInfNFe().getDet().size(); i++) {
        BuscaXmlProduto produto = new BuscaXmlProduto();
        produto.setItem(i);
        produto.setCod(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getCProd());
        produto.setCfop(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getCFOP());
        produto.setNcm(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getNCM());
        produto.setDescricao(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getXProd());
        produto.setEmbalagem(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getUCom());
        produto.setQuantidade(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getQCom());
        produto.setValor(new BigDecimal(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getVUnCom()));
        produto.setValorTotal(new BigDecimal(enviNfe.getNFe().get(0).getInfNFe().getDet().get(i).getProd().getVProd()));
        produtos.add(produto);
      }
      buscaXml.setProdutos(produtos);
      
    } catch (JAXBException ex) {
      Logger.getLogger(ProcessaXmlUtil.class.getName()).log(Level.SEVERE, null, ex);
    }
    return buscaXml;
  }

  public TEnviNFe getXml(String caminho) throws JAXBException {
    TEnviNFe enviNfe = ObjectFactory.createTEnviNFe();
    try {
      JAXBContext context = JAXBContext.newInstance("imp");
      Unmarshaller unmarshaller = context.createUnmarshaller();
      File notaFile = new File(caminho);
      enviNfe = unmarshaller.unmarshal(new StreamSource(notaFile), TEnviNFe.class).getValue();
    } catch (JAXBException e) {
      JOptionPane.showMessageDialog(null, "Erro ao iniciar processamento dos dados do xml.\n\n"
              + e.getMessage());
    }
    return enviNfe;
  }
}
